/**
 * Project 67th
 */


#ifndef _TASKQUEUE_H
#define _TASKQUEUE_H

#include <unistd.h>
#include <iostream>
#include <functional>
#include <queue>
#include <mutex>
#include <condition_variable>
using std::cout;
using std::endl;
using std::queue;
using std::mutex;
using std::unique_lock;
using std::lock_guard;
using std::condition_variable;
using std::function;
using std::bind;

extern mutex coutMtx;

using ElemType = function<void()>;

class TaskQueue {
public: 
    /**
     * @param capa
     */
    TaskQueue(size_t capa);
    ~TaskQueue();

    /**
     * @param val
     */
    //由生产者线程使用
    //往TaskQueue中存放数据
    void push(ElemType val);
    
    //由消费者线程使用
    //从TaskQueue中取走数据
    ElemType pop();

    //判满以及判空
    bool full();
    bool empty();

    void wakeup();
private: 
    size_t _capacity; //TaskQueue的容量
    queue<ElemType> _que; //底层的容器
    mutex _mtx; //TaskQueue中的数据需要进行互斥访问
    condition_variable _notEmpty;//非空条件变量
    condition_variable _notFull;//非满条件变量
    bool _flag;
};

#endif //_TASKQUEUE_H
